Amazon EC2 アクセス制御レシピ
はじめに
悪意のあるユーザーからシステムを守るにあたって、アクセス制御は重要です。 社内システムのような一般公開しないシステムの場合は必要な拠点からのみ接続を許可することで、悪意のあるユーザーからの攻撃をブロックします。 ECサイトのような一般公開するシステムの場合は必要な通信のみ許可します。 不要な通信を許可すると、攻撃が成立しやすくなります。
攻撃を防ぐだけでなく、攻撃を受けた後の対応としてもアクセス制御は重要です。 例えば、特定IPアドレスからの攻撃が認められる場合、そのIPアドレスをブロックします。
本記事ではAmazon EC2で行うアクセス制御の基本を整理します。 本記事でのアクセス制御は、主にIPアドレスベースでの制御を対象にします。
EC2のアクセス制限には主にセキュリティグループとネットワークACLで行います。 上記との2重管理になるため、iptablesやWindowsファイアウォールはオフにするケースが多いです。 大量のIPブラックリストを登録するには、AWS WAFが適しています。 AWSサービスでは対応が難しい場合、パートナーやサードパーティが提供するWAFやUTMを検討します。 特定の国からの不正アクセスを防ぐにはCloudFrontのGeoIPが利用できます。 GeoIPは必ずしも正確ではない点に注意が必要です。
セキュリティグループ
セキュリティグループの基本的な内容とよく行う設定をご紹介します。
EC2単位で許可ルールを設定
セキュリティグループはEC2インスタンス単位に設定します。 インバウンド(受信)/アウトバウンド(送信)について、許可する通信を指定します。 ステートフルに許可されるので、戻りのパケットについては自動的に許可されます。
- インスタンス単位に設定
- インバウンド/アウトバウンド
- 許可
- ステートフル
許可する通信はプロトコル、ポート番号と送信元/宛先を設定します。 インバウンドルールは送信元、アウトバウンドルールでは宛先を指定します。 送信元/宛先はネットワークアドレスまたはセキュリティグループを選択出来ます。 セキュリティグループを指定すると、そのセキュリティグループが割り当てられたインスタンスからの接続が許可されます。
- プロトコル
- ポート番号
- 送信元(インバウンドルール)/宛先(アウトバウンドルール)
- ネットワークアドレス
- セキュリティグループ
役割ごとにグループを作成
セキュリティグループは役割ごとに作成する事が多いです。 送信元にセキュリティグループを指定する際に役立ちます。また、個々のルールの意味を認識しやすくなります。 あまり細分化すると分かりづらくなる事があるため、バランスを見ます。 目安としては2つ〜3つに抑えるといいと思います。 Webサーバーであれば、サービス提供(http)と管理用(ssh)に分けると良いでしょう。
- サービス提供(http)グループ
- 管理用(ssh)グループ
スタンドアローンの設定例
スタンドアローンのEC2について、設定例をご紹介します。
インバウンドは必要最低限
インバウンドでは、必要最低限の許可を指定します。 送信元とポートの許可を絞る事がポイントです。 一般公開するWebサーバであれば、HTTPでインターネット全体からアクセスできるようにし、管理用のSSHは自拠点のIPアドレスのみ許可します。 例として、セキュリティグループ"webserver"と"ssh"の2つのグループを適用します。 送信元"0.0.0.0/0"はインターネット全体を意味します。
タイプ | プロトコル | ポート範囲 | 送信元 |
HTTP | TCP | 80 | 0.0.0.0/0 |
タイプ | プロトコル | ポート範囲 | 送信元 |
SSH | TCP | 22 | 自拠点のIPアドレス/32 |
アウトバウンドは全て許可が基本
セキュリティグループのアウトバウンドはすべて許可することが多いです。 宛先を制限する事で、NTPの同期、OSパッチのダウンロード、AWS APIの実行など必要な通信をブロックしないようにします。
ELB + EC2 + RDS の設定例
ELB,EC2,RDSを利用する場合の設定例をご紹介します。 一般公開するWebサーバーを想定します。
EC2のインバウンドにはELBのセキュリティグループを指定
ELB,RDSについても、EC2と同様にセキュリティグループを設定できます。
ELBのセキュリティグループ(インバウンド)では、HTTPでインターネットからアクセスできるようにします。
タイプ | プロトコル | ポート範囲 | 送信元 |
HTTP | TCP | 80 | 0.0.0.0/0 |
EC2のセキュリティグループ(インバウンド)では、送信元にELBのセキュリティグループを指定します。 これにより、ELBを経由した通信が許可されます。 送信元に"0.0.0.0/0"を指定すると、EC2直接の通信も許可されるので注意してください。
タイプ | プロトコル | ポート範囲 | 送信元 |
HTTP | TCP | 80 | elb-http |
RDSのセキュリティグループ(インバウンド)では、送信元にEC2のセキュリティグループを指定します。 サブネットのネットワークアドレスやEC2のIPアドレスを指定しても、通信は許可されます。 セキュリティグループを指定する事が多いですが、ケースバイケースで使い分けます。
タイプ | プロトコル | ポート範囲 | 送信元 |
MYSQL/Aurora | TCP | 3306 | webserver |
ネットワークACL
ネットワークACLの基本的な内容と設定例をご紹介します。 ネットワークACLはNACL(ナクル)と呼ばれる事も多いです。
サブネット単位で許可/拒否ルールを設定
ネットワークACLはサブネットにつき1つ設定します。 インバウンドとアウトバウンドに適用する点はセキュリティグループと同じです。 セキュリティグループとは違い、許可と拒否を指定できます。 また、ステートレスに許可されるため戻りの通信についても許可する必要があります。 ルールに一致しない通信は拒否されます。
- サブネットにつき1つ
- インバウンド/アウトバウンド
- 許可/拒否
- 小さい番号から適用
- ステートレス
- ルールに一致しない通信は拒否
通信の指定はセキュリティグループとあまり変わりません。 送信元/宛先にはネットワークアドレスを指定出来ます。 インバウンドでは送信元、アウトバウンドでは宛先を指定します。
- プロトコル
- ポート番号
- 送信元(インバウンドルール)/宛先(アウトバウンドルール)
- ネットワークアドレス
設定例
インバウンドはデフォルト許可、必要であればブロックを追加
インバウンドのデフォルトは許可とします。 ブロックしたい通信がある場合は、番号の小さい拒否ルールを設定します。 アプリケーションログから、攻撃をうけたことがわかった場合などに利用します。 以下の例では、100番ですべての通信が許可されます。 100より小さい10番などで、拒否ルールを設定します。
ルール番号 | タイプ | プロトコル | ポート範囲 | 送信元 | 許可/拒否 |
10 | すべての トラフィック | すべて | すべて | 攻撃が認められたIP/32 | 拒否 |
100 | すべての トラフィック | すべて | すべて | 0.0.0.0/0 | 許可 |
* | すべての トラフィック | すべて | すべて | 0.0.0.0/0 | 拒否 |
ネットワークACLごとに最大40(デフォルト20)までのルールを追加できます。 大量のブラックリストを追加する用途には対応できないケースがあります。 最新のルール数制限はAmazon VPCユーザーガイドをご覧ください。
アウトバウンドは許可が基本
アウトバウンドはセキュリティグループと同様全て許可にする事が多いです。 絞る場合は必要な通信までブロックしないように注意します。
AWS Configで構成管理
セキュリティグループやネットワークACLの構成管理はAWS Configで行います。 セキュリティグループのルールが変更されたり、割り当てが変更された場合に記録を残しタイムラインで可視化出来ます。 有効化しておくと、後々助かるかもしれません。 詳しくはAWS Configはとりあえず有効にしようをご覧ください。
パーソナルファイアウォールは無効にする事が多い
iptablesやWindowsファイアウォールは無効にする事が多いです。 セキュリティグループとネットワークACLとの2重管理になるためです。 また、EC2の外でアクセス制御を行う事でEC2の負荷を下げる効果が期待出来ます。
大量のブラックリスト登録にはAWS WAFを使う
ネットワークACLは追加出来るルール数の制限が小さいため、大量のブラックリストの追加には適していません。 大量のブラックリストを登録する際は、AWS WAFを検討します。 AWS WAFの制限はこちらを参照ください。 なお、ホワイトリストについてもAWS WAFを検討出来るかと思います。
CloudFrontまたはApplication Load Balancerに設定可能
AWS WAFはCloudFrontまたはApplication Load Balancer(ALB)に設定します。
指定出来るIPレンジに制限がある
AWS WAFでは、指定出来るIPレンジに制限があります。 IPv4を利用の場合、/8,/16,/24,/32を指定出来ます(執筆時点) 最新の情報はDeveloper Guideをご覧ください。
AWS WAF supports /8, /16, /24, and /32 IPv4 address ranges and /16, /24, /32, /56, /64, and /128 IPv6 address ranges. For more information about CIDR notation, see the Wikipedia entry Classless Inter-Domain Routing.
パートナーやサードパーティが提供するWAFやUTMの検討
AWSサービスがマッチしない場合は、パートナーやサードパーティが提供するWAFやUTMを検討します。 特にオンプレミスからの移行では、オンプレミスと同じ製品がAWSで動作出来るか確認すると良いでしょう。 製品の利用形態として、クラウド型/バーチャル型/ホスト型があります。利用形態は新入社員のためのWAF(Web Application Firewall)入門が分かりやすいです。
CloudFrontで国ごとに許可/拒否(GeoIP)
CloudFrontでは、GeoIPによる国ごとに許可/拒否を指定できます。 特定の国からの攻撃が認められるようなケースでは有効です。 GeoIPは必ずしも正確ではない点に注意してください。
おわりに
Amazon EC2で行うアクセス制御の基本をご紹介しました。 適切なアクセス制御を行う事で攻撃を未然に防いだり、影響を小さくする事が出来ます。 必要な通信のみ許可する点に留意しましょう。